Snowpark Pythonによる機械学習モデル開発をはじめるための足掛かりのご紹介(2023年8月版)
データアナリティクス事業本部 機械学習チームの鈴木です。
2023年8月時点で、Snowpark MLのプレビューをはじめとして、Snowflakeを中心とする機械学習モデル開発や機械学習システム構築のサポートが強化されつつあります。
直近で、Snowpark Pythonを中心にSnowflakeの機械学習用途での利用方法についてキャッチアップを進めており、その中で執筆したり参考にしたりしたDevelopersIOの記事やSnowflakeのリソースについてご紹介します。
この記事の内容
Snowpark Pythonによる機械学習モデル開発をはじめるために、参考にするとよかった以下の観点について資料をまとめました。
- Snowpark Python用の開発環境
- Snowpark PythonのAPI
- 探索的データ分析
- 機械学習モデル開発
- リソース作成のためのIaCツール
これらの観点を通して資料を確認することで、記事執筆時点でプレビュー中のSnowpark MLを使うために必要なノウハウ習得の足掛かりになればと思います。
1. Snowpark Python用の開発環境
Python3.8を利用できる環境にSnowpark Pythonをインストールすることで、Pythonを使ってSnowflakeのデータを操作することができました。
以下の記事ではSnowflakeのドキュメントを参考に、Jupyter NotebookをインターフェースとしてインタラクティブにSnowpark Pythonを使い、Snowflakeのデータを操作するための環境構築例をご紹介しました。
SnowsightのPythonワークシートもありますが、現状ではSnowparkを使ったアプリケーション開発のための道具というよりは、SnowparkのDataFrameを使ってSnowflakeに格納したデータを検索・加工するためのものという印象でした。
また、Python3.9および3.10をサポートしたSnowpark Pythonも現在プレビュー中となっています。
2. Snowpark PythonのAPI
機械学習モデル開発の用途で特に押さえておきたいAPIを2つピックアップします。
DataFrameとその操作
DataFrameはSnowpark PythonによるSnowflakeのデータ操作の中心的なAPIです。
DataFrameを操作し、collect
などのアクションを実行すると、評価された対応するSQLがSnowflakeに送信されます。
以下の記事ではDataFrameの操作を紹介しつつ、Snowflakeのクエリ履歴からどのようなSQLに変換されたのかまでを確認しました。
UDF作成
UDFはSnowpark MLを使わない従来の機械学習モデルのデプロイで使用します。Snowpark PythonのAPIを使ってUDFを作成することができます。
以下の記事で、Snowpark PythonによるUDFの作成と、Snowflakeに送信されたSQLの確認を行いました。
3. 探索的データ分析
性能の良い機械学習モデルを作るためには探索的データ分析(Exploratory data analysis、以降EDA)によりデータにどのような傾向があるのかを探り、効果的な特徴量を作成することが重要です。
以下の記事ではAWS環境がある前提で、EDAをどのような環境で行うとよさそうかをご紹介しました。
特にSageMaker Studioノートブックを使う例として、Snowpark PythonでDataFrameを使ってデータを取得し、分析しました。
Snowflakeの公式ページの『DATA ANALYTICAL TOOLS』では、データから洞察を引き出すためのパートナーエコシステムとして、4つの製品を紹介しているため、ほかの選択肢を知りたい方は一度ご確認ください。
4. 機械学習モデル開発
Snowpark MLを使う方法
Snowpark ML APIの発表により、Snowflakeのリソースと仕組みを使って、機械学習モデルの開発とモデルの展開ができるようになりました。
※ 記事執筆時点ではプレビュー中の機能です。
現時点で、以下の『Snowpark ML: Machine Learning Toolkit for Snowflake』開発者ガイドに、Snowpark MLの2つの主となるコンポーネントが記載されています。
- Snowpark ML Development
- Snowpark ML Ops
同ガイドより利用イメージを引用します。以下はDecisionTreeClassifier
クラスのモデルを利用する例です。
# 2023/08/21に以下のリソースより引用 # https://docs.snowflake.com/en/developer-guide/snowpark-ml/snowpark-ml-modeling from snowflake.ml.modeling.tree import DecisionTreeClassifier model = DecisionTreeClassifier( input_cols=feature_column_names, label_cols=label_column_names, sample_weight_col=weight_column_name, output_cols=expected_output_column_names )
宣言したモデルはscikit-learnなど使い慣れたAPIと同様に、fit
でモデルの訓練を行うことができます。
# 2023/08/21に以下のリソースより引用 # https://docs.snowflake.com/en/developer-guide/snowpark-ml/snowpark-ml-modeling model.fit(df)
例から、Snowpark Pythonの使い方が分かる開発者であれば、人気のある機械学習ライブラリと同じようなインターフェースで利用できることが伺えます。
機械学習モデルは上記に記載の決定木のようなものから、LightGBMやXGBoostも利用できます。
デプロイしたモデルはSnowflakeに格納したデータに対して推論を行うこととなります。
以下のQuickStartでは、具体的にサンプルのノートブックを使ってSnowpark MLのAPIをどのように使えばいいか学ぶことができましたのでご紹介します。
UDFを使う方法
これまでのSnowpark MLを使わない従来のSnowflakeでの機械学習モデルのデプロイは、以下のQuickStartに例があります。Amazon SageMakerにて、SnowparkによりDataFrameをSnowflakeからデータを取得し、学習したモデルを含めてUDFを作成し、UDFの呼び出しにより推論を実行します。
以下はQuickStartで紹介されている『1_prepare_build_deploy_model.ipynb』に記載の、機械学習モデルを含んだUDFの例です。先に紹介したUDFに関するブログを併せて読んで頂くと仕組みが分かりやすいと思います。
# 2023/08/21に以下のリソースより引用 # https://github.com/Snowflake-Labs/sfguide-getting-started-snowpark-python-sagemaker/blob/main/1_prepare_build_deploy_model.ipynb @udf(name='predict_failure',session=session,replace=True,is_permanent=True,stage_location='@maint_stage') def predict_failure(df: PandasDataFrame[int, int, int, int, int, int]) -> PandasSeries[float]: import sklearn import pandas as pd df.columns = ['AIR_TEMPERATURE_K', 'PROCESS_TEMPERATURE', 'ROTATIONAL_SPEED_RPM','TORQUE_NM','TOOL_WEAR_MIN','HUMIDITY_RELATIVE_AVG'] model = load_model('model.pkl') return model.predict_proba(df)[:,1]
このようにUDFとしてデプロイすることでSnowflakeに格納したデータに対して推論を行うことができますが、単純に機械学習のアプリケーションとして利用したい場合は、例えばAmazon SageMakerで推論エンドポイントとしてデプロイしてもいいかもしれません。
5. リソース作成のためのIaCツール
データベースやデータウェアハウスなど、Snowflakeのリソースを作成するため、IaCツールを利用することが可能です。ここではTerraformおよびPulumiをご紹介します。
Terraform
以下のQuickstartでは、データベース・データウェアハウス・ユーザーなどのリソースを、Terraformを使って作成する例が紹介されていました。
Terraformでリソースをデプロイするときの認証には、ユーザー・パスワードおよびキーペアを使用することが可能です。
DevelopersIOでは少し前のものになりますが、以下の記事でご紹介していました。
Pulumi
TypeScriptとPulumiを使った方法も、DevelopersIOでご紹介していました。
以下の記事ではユーザーとデータベースを作成しています。ロールなどほかのリソースの記事についても、記事内にリンクが紹介されています。
DevelopersIOのSnowflakeのブログ
DevelopersIOでは#SnowflakeタグでSnowflakeに関するブログ記事を公開しているので、ぜひご確認ください。
最後に
Snowflakeの機械学習用途での利用方法について、関連するDevelopersIOの記事やSnowflakeのリソースをまとめてご紹介しました。
Snowpark MLの一般提供に向けて、関連する技術要素のキャッチアップの参考になりましたら幸いです。